package model;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import bean.PacoteE;
import bean.PacoteF;
import bean.PacoteT;

/*
 * Essa classe trata os dados vindos do metrologico
 * para o Perfil Magnetico * 
 * */

public class AnaliseInfoPerfil {
	private RegistroPerfilMagnetico registro = null;
	private ProcessaInfoPerfil processaInfoPerfil = null;
	
	
	private List<PacoteF> fluxoBruto = null;
	private int tempoInicial = -1;
	private PacoteT pacoteT = null;
	private PacoteE pacoteE = null;
	private int contadorDeOverflow = 0;
	
	public AnaliseInfoPerfil() {
		fluxoBruto = new ArrayList<PacoteF>();
		pacoteT = new PacoteT();
		pacoteE = new PacoteE();
		
		processaInfoPerfil = new ProcessaInfoPerfil();
	}
	
	public void limpaBuffer(){
		fluxoBruto = new ArrayList<PacoteF>();
		pacoteT = null;
		pacoteE = null;
		
		tempoInicial = -1;
		contadorDeOverflow = 0;
	}
	
	public void eventoDeEntrada(String pacote) {
		limpaBuffer();
		
		pacoteT = new PacoteT();
		pacoteT.geraPacoteT(pacote);
	}
	
	public void eventoDeFluxo(String pacote) {
		PacoteF pacoteF = new PacoteF(pacote);
		ajustaTempo(pacoteF);
		fluxoBruto.add(pacoteF);
	}
	
	public void eventoDeSaida(String pacote) {
		pacoteE = new PacoteE();
		pacoteE.geraPacoteE(pacote);
		
		montaRegistroPerfilMagnetico();
	}
	
	private void montaRegistroPerfilMagnetico(){
		registro = new RegistroPerfilMagnetico(fluxoBruto, pacoteT, pacoteE);
		
		processaInfoPerfil.executa(registro);
	}
	
	private void ajustaTempo(PacoteF fluxo) {		
		if (tempoInicial == -1) {
			tempoInicial = fluxo.getTempo();
		}
		
		int tempoAtual = fluxo.getTempo() + 65535
				* contadorDeOverflow;

		if ((tempoAtual < tempoInicial)) {
			contadorDeOverflow++;
			
			tempoAtual = fluxo.getTempo() + 65535
				* contadorDeOverflow;
		}
		
		int tempoAjustado = tempoAtual - tempoInicial;
		
		fluxo.setTempo(tempoAjustado);
	}
	
	public RegistroPerfilMagnetico getRegistroPerfil() {
		return registro;
	}
	
	
	//--------------------------------------------------------------------------
	//--------------------------------------------------------------------------
	
	public void getAllFilesFromDir(String path) {
		File diretorio = new File(path);
		String[] arquivos = diretorio.list();
		List<String> conteudoArquivo;

		for (String nomeDoArquivo : arquivos) {
			conteudoArquivo = OperacoesArquivos.lerTxt(path + nomeDoArquivo);

			for (String string : conteudoArquivo) {
//				evento(string);
			}
		}
	}

	public void executaPorArquivo(String nomeDoArquivo) {
		List<String> conteudoArquivo = OperacoesArquivos.lerTxt(nomeDoArquivo);

		for (String string : conteudoArquivo) {
//			evento(string);
		}
	}

	public void escutaSerial() {
		// TODO implementar lendo dados da porta serial - USB
	}

	public RegistroPerfilMagnetico getRegistroPerfilMagnetico() {
		return registro;
	}
}
